import UIKit

// 用户列表视图
class UserListView: UITableView, UITableViewDataSource, UITableViewDelegate {
    private var mColorfulList: [Bool]       // 彩色标志列表
    private var mGrayIconList: [UIImage]    // 灰色图标列表
    private var mNormalIconList: [UIImage]  // 正常图标列表
    private var mTextList: [String]         // 文字列表

    /**
     * 构造方法。
     */
    public override init(frame: CGRect, style: UITableView.Style) {
        mColorfulList = [Bool]()
        mGrayIconList = [UIImage]()
        mNormalIconList = [UIImage]()
        mTextList = [String]()
        super.init(frame: frame, style: style)
        dataSource = self
        delegate = self
    }

    /**
     * 必要的构造方法。
     * @param coder 解码器
     */
    public required init?(coder: NSCoder) {
        mColorfulList = [Bool]()
        mGrayIconList = [UIImage]()
        mNormalIconList = [UIImage]()
        mTextList = [String]()
        super.init(coder: coder)
        dataSource = self
        delegate = self
    }
    
    /**
     * 添加一个表项。
     * @param itemText  表项文字
     * @param iconIndex 图标索引
     * @param colorful  彩色则为 true，灰色则为 false
     */
    public func addItem(_ itemText: String, iconIndex: Int, colorful: Bool) {
        // 添加正常图标
        let fileName = String(format: Const.ICON_FILE_NAME, iconIndex)
        let normalIcon = UIImage(named: fileName)!
        mNormalIconList.append(normalIcon)
        
        // 添加灰色图标
        let grayIcon = self.getGrayImage(normalIcon)
        mGrayIconList.append(grayIcon)

        // 添加颜色标志
        mColorfulList.append(colorful)

        // 添加文字
        mTextList.append(itemText)

        // 刷新
        super.reloadData()
    }
    
    /**
     * 改变某个表项的图标颜色。
     * @param itemText  表项的文字
     * @param colorful  彩色则为 true，灰色则为 false
     */
    public func changeItemColor(_ itemText: String, colorful: Bool) {
        // 查找表项
        let itemIndex = mTextList.firstIndex(of: itemText)
        if itemIndex == nil {
            return
        }

        // 设置图标颜色
        mColorfulList[itemIndex!] = colorful
        let indexPath = IndexPath(row: itemIndex!, section: 0)
        super.reloadRows(at: [indexPath], with: .none)
    }
 
    /**
     * 清除所有表项。
     */
    public func clear() {
        mColorfulList.removeAll()
        mGrayIconList.removeAll()
        mNormalIconList.removeAll()
        mTextList.removeAll()
        super.reloadData()
    }
    
    /**
     * 获取灰色图标。
     * @param image 图标
     * @return 灰色图标
     */
    private func getGrayImage(_ image: UIImage) -> UIImage {
        // 获得原图标的尺寸
        let imageSize = image.size
        
        // 创建一个灰色的设备环境
        let context = CGContext(data: nil, width: Int(imageSize.width), height: Int(imageSize.height), bitsPerComponent: 8,
            bytesPerRow: 0, space: CGColorSpaceCreateDeviceGray(), bitmapInfo: CGBitmapInfo().rawValue)!
        
        // 将图标画到灰色设备环境上
        let rect = CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height)
        context.draw(image.cgImage!, in: rect)
        
        // 从设备环境中获取灰色图标
        return UIImage(cgImage: context.makeImage()!)
    }

    /**
     * 获取表项上的文字。
     * @param itemIndex 表项索引
     * @return 表项上的文字
     */
    public func getItemText(itemIndex: Int) -> String {
        return mTextList[itemIndex]
    }
    
    /**
     * 获取列表视图的所有节点的个数。
     * @param tableView 列表视图
     * @return 所有节点的个数
     */
    internal func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
  
    /**
     * 获取一个节点的所有单元格数。
     * @param tableView 列表视图
     * @param section   第几个节点
     * @return 一个节点的所有单元格数
     */
    internal func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return mTextList.count
    }
    
    /**
     * 设置一个单元格上的所有表项的文字。
     * @return 一个单元格
     */
    internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 获取表项
        let cell = tableView.dequeueReusableCell(withIdentifier: "ID_USER_CELL", for: indexPath)
        
        // 设置表项文字
        cell.textLabel?.text = mTextList[indexPath.row]
        cell.imageView?.image = mColorfulList[indexPath.row] ? mNormalIconList[indexPath.row]: mGrayIconList[indexPath.row]
        
        // 设置选中状态
        cell.selectionStyle = .none
        
        return cell
    }
}
